// Entrées détecteur de niveaux 
const int B = 2;    // Bas 
const int H = 3;    // Haut 

// Sorties indicateurs (LEDs)   
const int Flag_B = 5;
const int Flag_H = 6;
int HB_val=0; 

// Sortie pompe  
const int P_LED = 9;
const int P = 10;
void setup() 
{    
    Serial.begin(9600); 
    
    //Init 
    pinMode(B,INPUT);
    pinMode(H,INPUT);
    pinMode(Flag_B,OUTPUT);
    pinMode(Flag_H,OUTPUT);
    pinMode(P,OUTPUT);
    pinMode(P_LED,OUTPUT);
    
    digitalWrite(Flag_B, LOW);
    digitalWrite(Flag_H, LOW);
    digitalWrite(P_LED, LOW);
    digitalWrite(P, HIGH);  
}

void loop() 
{  
    /*Serial.println(GetHB(H, B));
    delay(1000); */
    
    // Etat '1'    
    while(1)
    {
      // Lectures H & B
      HB_val=GetHB(H, B);

      // Condition de l'activation des sorties 
      if(HB_val==0)
      {
        SetPompe(1, P,P_LED);
        SetLED(HB_val,Flag_B, Flag_H);
      }
      
      // Condition de passage à l'état suivant 
      if(HB_val==1)
        break; 

      // Délais (pas necessaire) 
      delay(200);  
    }
    // Etat '2'  
    while(1)
    {
      HB_val=GetHB(H, B);
      if(HB_val==1)
      {
        SetPompe(1, P,P_LED);
        SetLED(HB_val,Flag_B, Flag_H);
      }
      if(HB_val==3)
        break; 
        
      delay(200);
    }

    // Etat '3'  
    while(1)
    {
      HB_val=GetHB(H, B);
      if((HB_val==3)||(HB_val==2))
      {
        SetPompe(0, P,P_LED);
        SetLED(HB_val,Flag_B, Flag_H);
      }
      if(HB_val==1)
        break; 
        
      delay(200); 
    }

    // Etat '4'  
    while(1)
    {
      HB_val=GetHB(H, B);
      if(HB_val==1)
      {
        SetPompe(0, P,P_LED);
        SetLED(HB_val,Flag_B, Flag_H);
      }
      if(HB_val==0)
        break; 

      delay(200);
    }
}

int GetHB(int H_Pin, int B_Pin)
{
  int HB=0; 
  if(digitalRead(B_Pin)==1) 
    HB=HB+1; 
  
  if(digitalRead(H_Pin)==1) 
    HB=HB+2; 
  
  return HB;
}

void SetLED(byte HB_val, int Flag_BB, int Flag_HH )
{
  switch (HB_val) 
  {
    case 0:
      digitalWrite(Flag_BB, LOW);
      digitalWrite(Flag_HH, LOW);
      break;
    case 1:
      digitalWrite(Flag_BB, HIGH);
      digitalWrite(Flag_HH, LOW);
      break;
    case 2:
      digitalWrite(Flag_BB, LOW);
      digitalWrite(Flag_HH, HIGH);
      break;
    case 3:
      digitalWrite(Flag_BB, HIGH);
      digitalWrite(Flag_HH, HIGH);
      break;
  }
}

void SetPompe(byte P_val, int PP, int P_LEDD )
{
  if(P_val==0)
  {
    digitalWrite(P_LEDD, LOW);
    digitalWrite(PP, HIGH);
  }
  else
  {
    digitalWrite(P_LEDD, HIGH);
    digitalWrite(PP, LOW);
  }
}
